package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.exception.LogicException;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dto.LoginDto;
import com.heima.model.user.pojo.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import com.heima.utils.common.MD5Utils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Service("apUserService")
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {

    @Resource
    private ApUserMapper apUserMapper;

    @Override
    public Map<String, Object> login(LoginDto dto) {
        // 1. 匿名登录 : 用户名密码参数均没有
        if (dto == null || StringUtils.isEmpty(dto.getPhone()) && StringUtils.isEmpty(dto.getPassword())) {
            //3. 如果是匿名登录, 直接颁发token
            String token = AppJwtUtil.getToken(0L);
            Map<String, Object> result = new HashMap<>();
            result.put("token", token);

            return result;
        }

        //2. 如果是正常登录, 需要校验手机号和密码
        //2.1 根据用户手机号查询用户详情
        ApUser apUser = apUserMapper.selectOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
        if (apUser == null) {
            throw new LogicException(AppHttpCodeEnum.LOGIN_PARAM_ERROR);
        }
        //判断用户账户是否被禁用
        if (apUser.getStatus() == 0) {
            throw new LogicException(AppHttpCodeEnum.LOGIN_PARAM_ERROR);
        }
        //2.2 使用用户输入的密码和数据库中保存的盐进行加盐加密得到密文
        String encode = MD5Utils.encodeWithSalt(dto.getPassword(), apUser.getSalt());
        //2.3 使用数据库中保存的密文和上一步加盐加密的密文进行比对
        if (!StringUtils.equals(apUser.getPassword(), encode)) {
            //2.3.1 比对失败 登录失败
            throw new LogicException(AppHttpCodeEnum.LOGIN_PARAM_ERROR);
        }
        //2.3.2 比对通过 登录成功
        String token = AppJwtUtil.getToken(apUser.getId());

        Map<String, Object> result = new HashMap<>();
        apUser.setSalt(null);
        apUser.setPassword(null);
        result.put("user", apUser);
        result.put("token", token);

        return result;

    }
}

